import { defineStore } from 'pinia'
import { ref, onMounted } from 'vue'
const { ipcRenderer } = require('electron')

export const useStockStore = defineStore('stock', () => {
  const indexes = ref([
    { code: 'sh000001', name: '上证指数', price: '--', change: '--', changePercent: 0 },
    { code: 'sz399001', name: '深证成指', price: '--', change: '--', changePercent: 0 },
    { code: 'sz399006', name: '创业板指', price: '--', change: '--', changePercent: 0 }
  ])
  
  const stocks = ref([])
  const searchResults = ref([])

  // 更新行情数据
  const updateQuotes = async (codes) => {
    try {
      const results = await ipcRenderer.invoke('fetch-stock-quotes', codes)
      if (results) {
        results.forEach(result => {
          const data = parseQuoteData(result)
          updateStockData(data)
        })
      }
    } catch (error) {
      console.error('更新行情数据失败:', error)
    }
  }

  // 初始化三大指数
  const initIndexes = async () => {
    const codes = indexes.value.map(index => index.code)
    await updateQuotes(codes)
  }

  // 搜索股票
  const searchStocks = async (keyword) => {
    try {
      const result = await ipcRenderer.invoke('search-stocks', keyword)
      //console.log('搜索股票结果result:', result)
      if (result && result.data) {
        const stocks = result.data.stock.slice(0, 5).map(item => ({
          code: item.code,
          name: item.name
        }))
        //console.log('搜索股票结果:', stocks)
        searchResults.value = stocks
      }
    } catch (error) {
      console.error('搜索股票失败:', error)
      searchResults.value = []
    }
  }

  // 添加自选股
  const addStock = (stock) => {
    if (!stocks.value.find(s => s.code === stock.code)) {
      stocks.value.push({
        ...stock,
        price: '--',
        change: '--',
        changePercent: 0
      })
      updateQuotes([stock.code])
      clearSearchResults()
      // 添加股票后保存到本地
      saveStocksToLocal()
    }
  }

  // 删除自选股
  const removeStock = (code) => {
    stocks.value = stocks.value.filter(stock => stock.code !== code)
    // 删除股票后保存到本地
    saveStocksToLocal()
  }

  // 解析行情数据
  const parseQuoteData = (data) => {
    // 解析腾讯股票接口返回的数据格式
    // 示例: v_sz399001="51~深证成指~399001~10438.72~......"
    // 从v_sz399001=中解析出sz399001
    const codeMatch = data.match(/v_([^=]+)=/)
    if (!codeMatch) return null
    const stockCode = codeMatch[1]

    const match = data.match(/"([^"]+)"/)
    if (!match) return null
    const parts = match[1].split('~')

    return {
      code: stockCode, // 股票代码parts[2]
      name: parts[1], // 股票名称
      price: parseFloat(parts[3]), // 当前价格
      change: parseFloat(parts[31]), // 涨跌额
      changePercent: parseFloat(parts[32]) // 涨跌幅
    }
  }

  // 更新股票数据
  const updateStockData = (data) => {
    //console.log('更新股票数据1:', data)
    // 更新指数数据
    const index = indexes.value.find(item => item.code === data.code)
    if (index) {
      // 使用 Object.assign() 将 data 对象的属性复制到 index 对象中
      // 这样可以更新指数的价格、涨跌额、涨跌幅等数据
      // 相当于:
      // index.price = data.price
      // index.change = data.change 
      // index.changePercent = data.changePercent
      Object.assign(index, data)

      //console.log('更新指数数据:', index)
    }
    
    // 更新自选股数据
    const stock = stocks.value.find(item => item.code === data.code)
    if (stock) {
      Object.assign(stock, data)
    }
  }

  // 启动自动更新
  const startAutoUpdate = () => {
    setInterval(() => {
      // 使用展开运算符(...)将两个数组合并成一个新数组:
      // 1. indexes.value.map(i => i.code) 获取所有指数代码
      // 2. stocks.value.map(s => s.code) 获取所有自选股代码
      // 最终得到包含所有股票代码的数组
      const allCodes = [...indexes.value.map(i => i.code), ...stocks.value.map(s => s.code)]
      if (allCodes.length > 0) {
        updateQuotes(allCodes)
      }
    }, 5000)
  }

  // 添加清空搜索结果的方法
  const clearSearchResults = () => {
    searchResults.value = []
  }

  // 加载本地存储的股票
  const loadStoredStocks = async () => {
    try {
      const storedStocks = await ipcRenderer.invoke('load-stored-stocks')
      if (storedStocks && storedStocks.length > 0) {
        stocks.value = storedStocks.map(stock => ({
          code: stock.code,
          name: stock.name,
          price: '--',
          change: '--',
          changePercent: 0
        }))
        // 加载后立即更新行情
        const codes = stocks.value.map(stock => stock.code)
        updateQuotes(codes)
      }
    } catch (error) {
      console.error('加载本地存储失败:', error)
    }
  }

  // 保存股票到本地存储
  const saveStocksToLocal = async () => {
    try {
      // 只保存必要的数据字段
      const stocksToSave = stocks.value.map(stock => ({
        code: stock.code,
        name: stock.name
      }))
      await ipcRenderer.invoke('save-stocks', stocksToSave)
    } catch (error) {
      console.error('保存到本地存储失败:', error)
    }
  }

  // 初始化时加载本地数据
  const initialize = async () => {
    await loadStoredStocks()
    await initIndexes()
    startAutoUpdate()
  }

  return {
    indexes,
    stocks,
    searchResults,
    initIndexes,
    searchStocks,
    addStock,
    removeStock,
    startAutoUpdate,
    updateQuotes,
    clearSearchResults,
    initialize,  // 导出初始化方法
    loadStoredStocks
  }
}) 